<!DOCTYPE html>












  


<html class="theme-next pisces use-motion" lang="en">
<head><meta name="generator" content="Hexo 3.9.0">
  <meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">






















<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css?v=4.7.0">

<link rel="stylesheet" href="/css/main.css?v=7.2.0">


  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=7.2.0">


  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=7.2.0">


  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=7.2.0">


  <link rel="mask-icon" href="/images/logo.svg?v=7.2.0" color="#222">







<script id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Pisces',
    version: '7.2.0',
    sidebar: {"position":"left","display":"post","offset":12,"onmobile":false,"dimmer":false},
    back2top: true,
    back2top_sidebar: false,
    fancybox: false,
    fastclick: false,
    lazyload: false,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>


  




  <meta name="description" content="Git使用基础">
<meta name="keywords" content="Git">
<meta property="og:type" content="article">
<meta property="og:title" content="Git使用基础">
<meta property="og:url" content="http://yoursite.com/2021/02/25/软件工程相关/Git使用基础/index.html">
<meta property="og:site_name" content="MingRong&#39;s Boat">
<meta property="og:description" content="Git使用基础">
<meta property="og:locale" content="en">
<meta property="og:image" content="http://yoursite.com/2021/02/25/软件工程相关/Git使用基础/20120201121201_805.png">
<meta property="og:image" content="http://yoursite.com/2021/02/25/软件工程相关/Git使用基础/20120201121201_94.png">
<meta property="og:image" content="http://yoursite.com/2021/02/25/软件工程相关/Git使用基础/20120201121202_798.png">
<meta property="og:image" content="http://yoursite.com/2021/02/25/软件工程相关/Git使用基础/20120201121204_39.png">
<meta property="og:image" content="http://yoursite.com/2021/02/25/软件工程相关/Git使用基础/20120201121205_151.png">
<meta property="og:image" content="http://yoursite.com/2021/02/25/软件工程相关/Git使用基础/20120328111440_202.png">
<meta property="og:image" content="http://yoursite.com/2021/02/25/软件工程相关/Git使用基础/20120328111443_111.png">
<meta property="og:image" content="http://yoursite.com/2021/02/25/软件工程相关/Git使用基础/0.jpg">
<meta property="og:updated_time" content="2021-02-25T06:53:40.139Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Git使用基础">
<meta name="twitter:description" content="Git使用基础">
<meta name="twitter:image" content="http://yoursite.com/2021/02/25/软件工程相关/Git使用基础/20120201121201_805.png">





  
  
  <link rel="canonical" href="http://yoursite.com/2021/02/25/软件工程相关/Git使用基础/">



<script id="page.configurations">
  CONFIG.page = {
    sidebar: "",
  };
</script>

  <title>Git使用基础 | MingRong's Boat</title>
  












  <noscript>
  <style>
  .use-motion .motion-element,
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-title { opacity: initial; }

  .use-motion .logo,
  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="en">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta">
    

    <div class="custom-logo-site-title">
      <a href="/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">MingRong's Boat</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
    
      
        <p class="site-subtitle">O Captain! My Captain!</p>
      
    
    
  </div>

  <div class="site-nav-toggle">
    <button aria-label="Toggle navigation bar">
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>



<nav class="site-nav">
  
    <ul id="menu" class="menu">
      
        
        
        
          
          <li class="menu-item menu-item-home">

    
    
      
    

    

    <a href="/" rel="section"><i class="menu-item-icon fa fa-fw fa-home"></i> <br>Home</a>

  </li>
        
        
        
          
          <li class="menu-item menu-item-categories">

    
    
      
    

    

    <a href="/categories/" rel="section"><i class="menu-item-icon fa fa-fw fa-th"></i> <br>Categories</a>

  </li>
        
        
        
          
          <li class="menu-item menu-item-tags">

    
    
      
    

    

    <a href="/tags/" rel="section"><i class="menu-item-icon fa fa-fw fa-tags"></i> <br>Tags</a>

  </li>
        
        
        
          
          <li class="menu-item menu-item-archives">

    
    
      
    

    

    <a href="/archives/" rel="section"><i class="menu-item-icon fa fa-fw fa-archive"></i> <br>Archives</a>

  </li>
        
        
        
          
          <li class="menu-item menu-item-about">

    
    
      
    

    

    <a href="/about/" rel="section"><i class="menu-item-icon fa fa-fw fa-user"></i> <br>About</a>

  </li>

      
      
    </ul>
  

  

  
</nav>



  



</div>
    </header>

    


    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          
            

          
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://yoursite.com/2021/02/25/软件工程相关/Git使用基础/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="MingRongChen">
      <meta itemprop="description" content="O Captain! My Captain!">
      <meta itemprop="image" content="/images/geass.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="MingRong's Boat">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">Git使用基础

              
            
          </h1>
        

        <div class="post-meta">

          
          
          

          
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              

              
                
              

              <time title="Created: 2021-02-25 11:03:15 / Modified: 14:53:40" itemprop="dateCreated datePublished" datetime="2021-02-25T11:03:15+08:00">2021-02-25</time>
            </span>
          

          
            

            
          

          
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">In</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/软件工程相关/" itemprop="url" rel="index"><span itemprop="name">软件工程相关</span></a></span>

                
                
              
            </span>
          

          
            
            
          

          
          

          
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-eye"></i>
                 Views:  
                <span class="busuanzi-value" id="busuanzi_value_page_pv"></span>
              </span>
            </span>
          

          <br>
          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <h1 id="Git使用基础"><a href="#Git使用基础" class="headerlink" title="Git使用基础"></a>Git使用基础</h1><a id="more"></a>

<h2 id="概要"><a href="#概要" class="headerlink" title="概要"></a>概要</h2><h3 id="版本控制"><a href="#版本控制" class="headerlink" title="版本控制"></a>版本控制</h3><p>  什么是版本控制？我真的需要吗？版本控制是一种记录若干文件内容变化，以便将来查阅特定版本修订情况的系统。在本书所展示的例子中，我们仅对保存着软件源代码的文本文件作版本控制管理，但实际上，你可以对任何类型的文件进行版本控制。</p>
<p>  如果你是位图形或网页设计师，可能会需要保存某一幅图片或页面布局文件的所有修订版本（这或许是你非常渴望拥有的功能）。采用版本控制系统 （VCS）是个明智的选择。有了它你就可以将某个文件回溯到之前的状态，甚至将整个项目都回退到过去某个时间点的状态。你可以比较文件的变化细节，查出最 后是谁修改了哪个地方，从而导致出现怪异问题，又是谁在何时报告了某个功能缺陷等等。使用版本控制系统通常还意味着，就算你乱来一气把整个项目中的文件改 的改删的删，你也照样可以轻松恢复到原先的样子。但额外增加的工作量却微乎其微。</p>
<h4 id="本地版本控制"><a href="#本地版本控制" class="headerlink" title="本地版本控制"></a>本地版本控制</h4><p>  许多人习惯用复制整个项目目录的方式来保存不同的版本，或许还会改名加上备份时间以示区别。这么做唯一的好处就是简单。不过坏处也不少：有时候会混淆所在的工作目录，一旦弄错文件丢了数据就没法撤销恢复。</p>
<p>为了解决这个问题，人们很久以前就开发了许多种本地版本控制系统，大多都是采用某种简单的数据库来记录文件的历次更新差异。</p>
<p>其中最流行的一种叫做 rcs，现今许多计算机系统上都还看得到它的踪影。甚至在流行的 Mac OS X 系统上安装了开发者工具包之后，也可以使用 rcs 命令。它的工作原理基本上就是保存并管理文件补丁（patch）。文件补丁是一种特定格式的文本文件，记录着对应文件修订前后的内容变化。所以，根据每次 修订后的补丁，rcs 可以通过不断打补丁，计算出各个版本的文件内容。</p>
<p><img src="/2021/02/25/软件工程相关/Git使用基础/20120201121201_805.png" alt="Git详解之一 Git起步 "></p>
<h4 id="集中化的版本控制系统"><a href="#集中化的版本控制系统" class="headerlink" title="集中化的版本控制系统"></a>集中化的版本控制系统</h4><p>  人们又遇到一个问题，如何让在不同系统上的开发者协同工作？于是，集中化的版本控制系统（ Centralized Version Control Systems，简称 CVCS ）应运而生。这类系统，诸如 CVS，Subversion 以及 Perforce 等，都有一个单一的集中管理的服务器，保存所有文件的修订版本，而协同工作的人们都通过客户端连到这台服务器，取出最新的文件或者提交更新。多年以来，这已成为版本控制系统的标准做法（见下图）。</p>
<p>  这种做法带来了许多好处，特别是相较于老式的本地 VCS 来说。现在，每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限，并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。</p>
<p>  事分两面，有好有坏。这么做最显而易见的缺点是中央服务器的单点故障。如果宕机一小时，那么在这一小时内，谁都无法提交更新，也就无法协同工作。要 是中央服务器的磁盘发生故障，碰巧没做备份，或者备份不够及时，就还是会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录，而被客户端 提取出来的某些快照数据除外，但这样的话依然是个问题，你不能保证所有的数据都已经有人事先完整提取出来过。本地版本控制系统也存在类似问题，只要整个项 目的历史记录被保存在单一位置，就有丢失所有历史更新记录的风险。</p>
<p><img src="/2021/02/25/软件工程相关/Git使用基础/20120201121201_94.png" alt="Git详解之一 Git起步 "></p>
<h4 id="分布式版本控制系统"><a href="#分布式版本控制系统" class="headerlink" title="分布式版本控制系统"></a>分布式版本控制系统</h4><p>  分布式版本控制系统（ Distributed Version Control System，简称 DVCS ）面世了。在这类系统中，像 Git，Mercurial，Bazaar 以及 Darcs 等，客户端并不只提取最新版本的文件快照，而是把原始的代码仓库完整地镜像下来。这么一来，任何一处协同工作用的服务器发生故障，事后都可以用任何一个镜 像出来的本地仓库恢复。因为每一次的提取操作，实际上都是一次对代码仓库的完整备份（见下图）。</p>
<p>  更进一步，许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此，你就可以在同一个项目中，分别和不同工作小组的人相互协作。你可以根据需要设定不同的协作流程，比如层次模型式的工作流，而这在以前的集中式系统中是无法实现的。</p>
<p><img src="/2021/02/25/软件工程相关/Git使用基础/20120201121202_798.png" alt="Git详解之一 Git起步 "></p>
<p>　　事分两面，有好有坏。这么做最显而易见的缺点是中央服务器的单点故障。如果宕机一小时，那么在这一小时内，谁都无法提交更新，也就无法协同工作。要 是中央服务器的磁盘发生故障，碰巧没做备份，或者备份不够及时，就还是会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录，而被客户端 提取出来的某些快照数据除外，但这样的话依然是个问题，你不能保证所有的数据都已经有人事先完整提取出来过。本地版本控制系统也存在类似问题，只要整个项 目的历史记录被保存在单一位置，就有丢失所有历史更新记录的风险。</p>
<h2 id="Git基础"><a href="#Git基础" class="headerlink" title="Git基础"></a>Git基础</h2><h3 id="Git工作方式"><a href="#Git工作方式" class="headerlink" title="Git工作方式"></a>Git工作方式</h3><p>  Git 是把变化的文件作快照后，记录在一个微型的文件系统中。每次提交更新时，它会纵览一遍所有文件的指纹信息并对文件作一快照，然后保存一个指向这次快照 的索引。为提高性能，若文件没有变化，Git 不会再次保存，而只对上次保存的快照作一链接。Git 的工作方式如图所示。</p>
<p><img src="/2021/02/25/软件工程相关/Git使用基础/20120201121204_39.png" alt="Git详解之一 Git起步 "></p>
<h3 id="Git工作流程"><a href="#Git工作流程" class="headerlink" title="Git工作流程"></a>Git工作流程</h3><p>1、在工作目录中修改某些文件。</p>
<p>2、 对修改后的文件进行快照，然后保存到暂存区域。</p>
<p>3、 提交更新，将保存在暂存区域的文件快照永久转储到 Git 目录中。</p>
<p>  所以，我们可以从文件所处的位置来判断状态：如果是 Git 目录中保存着的特定版本文件，就属于已提交状态；如果作了修改并已放入暂存区域，就属于已暂存状态；如果自上次取出后，作了修改但还没有放到暂存区域，就 是已修改状态。到第二章的时候，我们会进一步了解其中细节，并学会如何根据文件状态实施后续操作，以及怎样跳过暂存直接提交。</p>
<p>在正式使用前，我们还需要弄清楚Git的三种重要模式，分别是<strong>已提交、已修改、已暂存</strong>。</p>
<p><img src="/2021/02/25/软件工程相关/Git使用基础/20120201121205_151.png" alt="Git详解之一 Git起步 "></p>
<ul>
<li>已提交(committed):表示数据文件已经顺利提交到Git数据库中。</li>
<li>已修改(modified):表示数据文件已经被修改，但未被保存到Git数据库中。</li>
<li>已暂存(staged):表示数据文件已经被修改，并会在下次提交时提交到Git数据库中。</li>
</ul>
<h2 id="Git使用"><a href="#Git使用" class="headerlink" title="Git使用"></a>Git使用</h2><h3 id="Git初始化"><a href="#Git初始化" class="headerlink" title="Git初始化"></a>Git初始化</h3><p>  <strong>git clone</strong>: 这是较为简单的一种初始化方式，当你已经有一个远程的Git版本库，只需要在本地克隆一份，例如’git clone git://github.com/someone/some_project.git some_project’命令就是将’git://github.com/someone/some_project.git’这个URL地址的远程版 本库完全克隆到本地some_project目录下面</p>
<p>   <strong>git init</strong>和<strong>git remote</strong>：这种方式稍微复杂一些，当你本地创建了一个工作目录，你可以进入这个目录，使用 git init 命令进行初始化，Git以后就会对该目录下的文件进行版本控制，这时候如果你需要将它放到远程服务器上，可以在远程服务器上创建一个目录，并把 可访问的URL记录下来，此时你就可以利用 git remote add 命令来增加一个远程服务器端，例如’git remote add origin git://github.com/someone/another_project.git’这条命令就会增加URL地址为’git: //github.com/someone/another_project.git’，名称为origin的远程服务器，以后提交代码的时候只需要使用 origin别名即可。</p>
<h3 id="Git基本命令"><a href="#Git基本命令" class="headerlink" title="Git基本命令"></a>Git基本命令</h3><p>​        <strong>git pull</strong>：从版本库(既可以是远程的也可以是本地的)将<strong>代码更新到本地</strong>，例如：’git pull origin master’就是将origin这个版本库的代码更新到本地的master主枝，该功能类似于SVN的update</p>
<p>​        <strong>git add</strong>：将所有改动的文件（新增和有变动的）<strong>放在暂存区，由git进行管理</strong>。</p>
<p>​        <strong>git rm</strong>：从当前的工作空间中和索引中删除文件，例如’git rm app/model/user.rb’，<strong>移除暂存区</strong>。</p>
<p>​        <strong>git commit</strong>：提交当前工作空间的修改内容，类似于SVN的commit命令，例如’<strong>git commit -m</strong> “story #3, add user model”‘，提交的时候必须用-m来输入一条提交信息。</p>
<p>​        <strong>git push</strong>：将本地commit的代码更新到远程版本库中，例如’<strong>git push origin branchname</strong>‘就会将本地的代码更新到名为orgin的远程版本库中。</p>
<p>​        <strong>git log</strong>：查看历史日志。</p>
<p>​        <strong>git revert</strong>：<strong>还原一个版本的修改</strong>，必须提供一个具体的Git版本号，例如’git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20’，Git的版本号都是生成的一个哈希值。</p>
<h3 id="Git-独有命令"><a href="#Git-独有命令" class="headerlink" title="Git 独有命令"></a>Git 独有命令</h3><p>​         <strong>git branch</strong>：对分支的增、删、查等操作，例如 git branch new_branch 会从当前的工作版本创建一个叫做new_branch的新分支，git branch -D new_branch 就会强制删除叫做new_branch的分支，git branch 就会列出本地所有的分支。</p>
<p>​          <strong>git checkout</strong>：Git的checkout有两个作用，其一是在 不同的branch之间进行切换，例如 ‘git checkout new_branch’就会切换到new_branch的分支上去;另一个功能是 还原代码的作用，例如git checkout app/model/user.rb 就会将user.rb文件从上一个已提交的版本中更新回来，未提交的内容全部会回滚</p>
<p>​          <strong>git rebase</strong>：用下面两幅图解释会比较清楚一些，rebase命令执行后，实际上是将分支点从C移到了G，这样分支也就具有了从C到G的功能 （使历史更加简洁明了）</p>
<p>​                       <img src="/2021/02/25/软件工程相关/Git使用基础/20120328111440_202.png" alt="Git使用基础篇 "></p>
<p>​          <strong>git reset</strong>：回滚到指定的版本号，我们有A-G提交的版本，其中C 的版本号是 bbaf6fb，我们执行了’git reset bbaf6fb’那么结果就只剩下了A-C三个提交的版本</p>
<p>​                        <img src="/2021/02/25/软件工程相关/Git使用基础/20120328111443_111.png" alt="Git使用基础篇 "></p>
<p>​          <strong>git stash</strong>：将当前未提交的工作存入Git工作栈中，时机成熟的时候再应用回来，这里暂时提一下这个命令的用法，后面在技巧篇会重点讲解</p>
<p>​          <strong>git config</strong>：新增、更改Git的各种设置，例如：git config branch.master.remote origin 就将master的远程版本库设置为别名叫做origin版本库</p>
<p>​          <strong>git tag</strong>：将某个版本打上一个标签，例如：git tag revert_version bbaf6fb50 来标记这个被你还原的版本，那么以后你想查看该版本时，就可以使用 revert_version标签名，而不是哈希值。</p>
<h3 id="Git其它命令"><a href="#Git其它命令" class="headerlink" title="Git其它命令"></a>Git其它命令</h3><p>​        <strong>add</strong>         #添加文件内容至索引</p>
<p>　　<strong>branch</strong>      #列出、创建或删除分支</p>
<p>　　<strong>checkout</strong>     #检出一个分支或路径到工作区</p>
<p>　　<strong>clone</strong>       #克隆一个版本库到一个新目录</p>
<p>　　<strong>commit</strong>  　#最近一次的提交，–amend修改最近一次提交说明</p>
<p>　　<strong>diff</strong>        #显示提交之间、提交和工作区之间等的差异　　</p>
<p>　　<strong>fetch</strong>       #从另外一个版本库下载对象和引用　</p>
<p>　　<strong>init</strong>        #创建一个空的 Git 版本库或重新初始化一个已存在的版本库</p>
<p>　　<strong>log</strong>         #显示提交日志 –stat 具体文件的改动</p>
<p>　　<strong>reflog</strong>　　　　#记录丢失的历史</p>
<p>　　<strong>merge</strong>      #合并两个或更多开发历史，–squash 把分支所有提交合并成一个提交</p>
<p>　　<strong>mv</strong>         #移动或重命名一个文件、目录或符号链接</p>
<p>　　<strong>pull</strong>        #获取并合并另外的版本库或一个本地分支（相当于git fetch和git merge）</p>
<p>　　<strong>push</strong>         #更新远程引用和相关的对象　　</p>
<p>　　<strong>rebase</strong>       #本地提交转移至更新后的上游分支中</p>
<p>　　<strong>reset</strong>         #重置当前HEAD到指定状态</p>
<p>　　<strong>rm</strong>         #从工作区和索引中删除文件</p>
<p>　　<strong>show</strong>        #显示各种类型的对象</p>
<p>　　<strong>status</strong>        #显示工作区状态</p>
<p>　　<strong>tag</strong>         #创建、列出、删除或校验一个GPG签名的 tag 对象 </p>
<p>　　<strong>cherry-pick</strong> #从其他分支复制指定的提交，然后导入到现在的分支</p>
<h3 id="git目录结构"><a href="#git目录结构" class="headerlink" title=".git目录结构"></a>.git目录结构</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">HEAD</span><br><span class="line">branches/</span><br><span class="line">config</span><br><span class="line">description</span><br><span class="line">hooks/</span><br><span class="line">index</span><br><span class="line">info/</span><br><span class="line">objects/</span><br><span class="line">refs/</span><br></pre></td></tr></table></figure>

<p>重要的文件和目录需要解释如下：</p>
<p>　　 <strong>HEAD</strong>：文件存放根节点的信息，其实目录结构就表示一个树型结构，Git采用这种树形结构来存储版本信息， 那么HEAD就表示根;</p>
<p>　　 <strong>refs</strong>：目录存储了你在当前版本控制目录下的各种不同引用(引用指的是你本地和远程所用到的各个树分支的信息)，它有heads、 remotes、stash、tags四个子目录，分别存储对不同的根、远程版本库、Git栈和标签的四种引用，你可以通过命令’git show-ref’更清晰地查看引用信息;</p>
<p>　　 <strong>logs</strong>：目录根据不同的引用存储了日志信息。因此，Git只需要代码根目录下的这一个.git目录就可以记录完 整的版本控制信息，而不是像SVN那样根目录和子目录下都有.svn目录。那么下面就来看一下Git与SVN的区别吧</p>
<p>　　 <strong>.gitigmore:</strong> 放一些不需要git管理的文件（例：IDE的工作目录 .idea）</p>
<h2 id="实战"><a href="#实战" class="headerlink" title="实战"></a>实战</h2><h3 id="创建版本库"><a href="#创建版本库" class="headerlink" title="创建版本库"></a>创建版本库</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">mkdir myfile</span><br><span class="line"><span class="built_in">cd</span> myfile</span><br><span class="line">git init</span><br><span class="line">git add codefile</span><br><span class="line">git commit -m <span class="string">"your description"</span></span><br></pre></td></tr></table></figure>

<h4 id="版本回退"><a href="#版本回退" class="headerlink" title="版本回退"></a>版本回退</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span></span><br><span class="line">git <span class="built_in">log</span> --pretty=oneline</span><br><span class="line">git reset --hard HEAD^</span><br><span class="line">git reset --hard commit_code</span><br><span class="line">git reflog <span class="comment">#查看历史操作记录</span></span><br></pre></td></tr></table></figure>

<h4 id="工作区和暂存区"><a href="#工作区和暂存区" class="headerlink" title="工作区和暂存区"></a>工作区和暂存区</h4><p>工作区（Working directory）：工作目录文件夹</p>
<p>版本库（Repository）：隐藏目录<code>.git</code>是<code>Git</code>版本库，其中最重要的就是称为stage（或者叫index）的暂存区，还有Git为我们自动创建的第一个分支<code>master</code>，以及指向<code>master</code>的一个指针叫<code>HEAD</code>。</p>
<p>版本添加，1、先通过<code>add</code>将文件添加到暂存区，2、再通过<code>commit</code>往当前<code>master</code>分区上提交更改</p>
<p><img src="/2021/02/25/软件工程相关/Git使用基础/0.jpg" alt="git-repo"></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git status<span class="comment"># 查看当前状态</span></span><br></pre></td></tr></table></figure>

<h4 id="管理修改"><a href="#管理修改" class="headerlink" title="管理修改"></a>管理修改</h4><p>如果修改文件<code>add</code>后，再次修改文件，然后<code>commit</code>提交，后面修改的文件未被添加到当前版本库，需要再次添加提交。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff HEAD -- readme.txt <span class="comment">#查看工作区和版本库里面最新版本区别</span></span><br></pre></td></tr></table></figure>

<h4 id="撤消修改"><a href="#撤消修改" class="headerlink" title="撤消修改"></a>撤消修改</h4><p>让文件回到最近一次<code>add</code>或则<code>commit</code>的状态</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git check -- filename <span class="comment">#使文件复原，撤销修改</span></span><br><span class="line">git reset HEAD filename <span class="comment">#文件add后，重新放回工作区</span></span><br></pre></td></tr></table></figure>

<h4 id="删除文件"><a href="#删除文件" class="headerlink" title="删除文件"></a>删除文件</h4><p>命令<code>git rm</code>用于删除一个文件。如果一个文件已经被提交到版本库，那么你永远不用担心误删，但是要小心，你只能恢复文件到最新版本，你会丢失<strong>最近一次提交后你修改的内容</strong>。</p>
<p><code>git checkout</code><strong>其实是用版本库里的版本替换工作区的版本，无论工作区是修改还是删除，都可以“一键还原”。</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">rm filename</span><br><span class="line">git rm filename</span><br><span class="line">git checkout -- filename <span class="comment">#撤销删除</span></span><br></pre></td></tr></table></figure>

<h3 id="远程仓库"><a href="#远程仓库" class="headerlink" title="远程仓库"></a>远程仓库</h3><h4 id="从本地关联远程库"><a href="#从本地关联远程库" class="headerlink" title="从本地关联远程库"></a>从本地关联远程库</h4><p>将本地git仓库与远程github仓库同步，关联一个远程库。</p>
<p>把本地库的内容推送到远程，用<code>git push</code>命令，实际上是把当前分支<code>master</code>推送到远程。只要本地作了提交，都可以通过以下命令将本地仓库推送到远程端。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git remote add origin git@server-name:path/repo-name.git</span><br><span class="line">git push -u origin master</span><br></pre></td></tr></table></figure>

<h4 id="从远程库克隆代码库"><a href="#从远程库克隆代码库" class="headerlink" title="从远程库克隆代码库"></a>从远程库克隆代码库</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> git@github.com:mingrongchen/Algorithm.git</span><br></pre></td></tr></table></figure>

<h3 id="分支管理"><a href="#分支管理" class="headerlink" title="分支管理"></a>分支管理</h3><p>时间线串成一条分支,用<code>git log --graph</code>命令可以看到分支合并图，使用<code>Fast forward</code>策略，合并分支时，加上<code>--no-ff</code>参数就可以用普通模式合并。若分支存在冲突不能快速合并，则解决冲突后再合并。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">git checkout -b newbranch</span><br><span class="line"><span class="comment">#-b代表创建并切换到当前分支，相当于</span></span><br><span class="line"><span class="comment">#git branch newbranch ，创建分支</span></span><br><span class="line"><span class="comment">#git checkout newbranch， 切换分支</span></span><br><span class="line">git branch <span class="comment">#查看分支</span></span><br><span class="line"><span class="comment"># 切换到主分支</span></span><br><span class="line">git merge newbranch<span class="comment">#在主分支合并新的分支</span></span><br><span class="line">git branch -d newbranch<span class="comment">#合并后删除分支</span></span><br></pre></td></tr></table></figure>

<h4 id="bug分支"><a href="#bug分支" class="headerlink" title="bug分支"></a>bug分支</h4><p>若当前工作未完成，需要解决一个bug分支，可以使用<code>stash</code>功能，将当前工作区隐藏，解决完bug分支后，再恢复现场继续工作。如果要丢弃一个没有被合并过的分支，可以通过<code>git branch -D &lt;name&gt;</code>强行删除。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">git stash  <span class="comment">#隐藏当前分支</span></span><br><span class="line"><span class="comment">#解决bug</span></span><br><span class="line">git checkout master <span class="comment">#在主分支上创建bug分支</span></span><br><span class="line">git checkout -b issue-101<span class="comment">#创建bug分支，一系列代码提交</span></span><br><span class="line">git checkout master <span class="comment">#切换回主分支，合并bug分支</span></span><br><span class="line">git merge --no-ff -m <span class="string">"merge bug fix 101"</span> issue-101</span><br><span class="line"></span><br><span class="line">git checkout myworkstation<span class="comment">#切换回自己当前分支</span></span><br><span class="line">git stash apply <span class="comment">#恢复当前内容or git stash pop 恢复后删除stash内容</span></span><br><span class="line">git stash list <span class="comment"># 查看stash内容</span></span><br><span class="line">git stash apply stash@&#123;0&#125; <span class="comment">#恢复指定stash，工作区</span></span><br></pre></td></tr></table></figure>


      
    </div>

    

    
    
    
    <div>
      
        <div>
    
        <div style="text-align:center;color: #ccc;font-size:14px;">-------------本文结束<i class="fa fa-paw"></i>感谢您的阅读-------------</div>
    
</div>
      
    </div>

    

    
      
    
    

    

    <footer class="post-footer">
      
        
          
        
        <div class="post-tags">
          
            <a href="/tags/Git/" rel="tag"># Git</a>
          
        </div>
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2021/02/23/Linux相关/Linux之Shell脚本基础/" rel="next" title="Linux之Shell脚本基础">
                <i class="fa fa-chevron-left"></i> Linux之Shell脚本基础
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2021/02/25/机器学习/机器学习基础概念/" rel="prev" title="机器学习基础概念">
                机器学习基础概念 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>


  </div>


          </div>
          

  



        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
            Table of Contents
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview-wrap">
            Overview
          </li>
        </ul>
      

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
            
              <img class="site-author-image" itemprop="image" src="/images/geass.jpg" alt="MingRongChen">
            
              <p class="site-author-name" itemprop="name">MingRongChen</p>
              <div class="site-description motion-element" itemprop="description">O Captain! My Captain!</div>
          </div>

          
            <nav class="site-state motion-element">
              
                <div class="site-state-item site-state-posts">
                
                  <a href="/archives/">
                
                    <span class="site-state-item-count">23</span>
                    <span class="site-state-item-name">posts</span>
                  </a>
                </div>
              

              
                
                
                <div class="site-state-item site-state-categories">
                  
                    
                      <a href="/categories/">
                    
                  
                    
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                    <span class="site-state-item-count">9</span>
                    <span class="site-state-item-name">categories</span>
                  </a>
                </div>
              

              
                
                
                <div class="site-state-item site-state-tags">
                  
                    
                      <a href="/tags/">
                    
                  
                    
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                    <span class="site-state-item-count">21</span>
                    <span class="site-state-item-name">tags</span>
                  </a>
                </div>
              
            </nav>
          

          

          

          
            <div class="links-of-author motion-element">
              
                <span class="links-of-author-item">
                  
                  
                    
                  
                  
                    
                  
                  <a href="https://github.com/mingrongchen" title="GitHub &rarr; https://github.com/mingrongchen" rel="noopener" target="_blank"><i class="fa fa-fw fa-github"></i>GitHub</a>
                </span>
              
                <span class="links-of-author-item">
                  
                  
                    
                  
                  
                    
                  
                  <a href="mailto:825296313@qq.com" title="E-Mail &rarr; mailto:825296313@qq.com" rel="noopener" target="_blank"><i class="fa fa-fw fa-envelope"></i>E-Mail</a>
                </span>
              
            </div>
          

          

          
          

          
            
          
          

        </div>
      </div>

      
      <!--noindex-->
        <div class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
            
            
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#Git使用基础"><span class="nav-number">1.</span> <span class="nav-text">Git使用基础</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#概要"><span class="nav-number">1.1.</span> <span class="nav-text">概要</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#版本控制"><span class="nav-number">1.1.1.</span> <span class="nav-text">版本控制</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#本地版本控制"><span class="nav-number">1.1.1.1.</span> <span class="nav-text">本地版本控制</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#集中化的版本控制系统"><span class="nav-number">1.1.1.2.</span> <span class="nav-text">集中化的版本控制系统</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#分布式版本控制系统"><span class="nav-number">1.1.1.3.</span> <span class="nav-text">分布式版本控制系统</span></a></li></ol></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Git基础"><span class="nav-number">1.2.</span> <span class="nav-text">Git基础</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#Git工作方式"><span class="nav-number">1.2.1.</span> <span class="nav-text">Git工作方式</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Git工作流程"><span class="nav-number">1.2.2.</span> <span class="nav-text">Git工作流程</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Git使用"><span class="nav-number">1.3.</span> <span class="nav-text">Git使用</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#Git初始化"><span class="nav-number">1.3.1.</span> <span class="nav-text">Git初始化</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Git基本命令"><span class="nav-number">1.3.2.</span> <span class="nav-text">Git基本命令</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Git-独有命令"><span class="nav-number">1.3.3.</span> <span class="nav-text">Git 独有命令</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Git其它命令"><span class="nav-number">1.3.4.</span> <span class="nav-text">Git其它命令</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#git目录结构"><span class="nav-number">1.3.5.</span> <span class="nav-text">.git目录结构</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#实战"><span class="nav-number">1.4.</span> <span class="nav-text">实战</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#创建版本库"><span class="nav-number">1.4.1.</span> <span class="nav-text">创建版本库</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#版本回退"><span class="nav-number">1.4.1.1.</span> <span class="nav-text">版本回退</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#工作区和暂存区"><span class="nav-number">1.4.1.2.</span> <span class="nav-text">工作区和暂存区</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#管理修改"><span class="nav-number">1.4.1.3.</span> <span class="nav-text">管理修改</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#撤消修改"><span class="nav-number">1.4.1.4.</span> <span class="nav-text">撤消修改</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#删除文件"><span class="nav-number">1.4.1.5.</span> <span class="nav-text">删除文件</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#远程仓库"><span class="nav-number">1.4.2.</span> <span class="nav-text">远程仓库</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#从本地关联远程库"><span class="nav-number">1.4.2.1.</span> <span class="nav-text">从本地关联远程库</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#从远程库克隆代码库"><span class="nav-number">1.4.2.2.</span> <span class="nav-text">从远程库克隆代码库</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#分支管理"><span class="nav-number">1.4.3.</span> <span class="nav-text">分支管理</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#bug分支"><span class="nav-number">1.4.3.1.</span> <span class="nav-text">bug分支</span></a></li></ol></li></ol></li></ol></li></ol></div>
            

          </div>
        </div>
      <!--/noindex-->
      

      

    </div>
  </aside>
  


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright">&copy; 2019 – <span itemprop="copyrightYear">2022</span>
  <span class="with-love" id="animate">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">MingRong</span>

  

  
</div>









        
<div class="busuanzi-count">
  <script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>

  
    <span class="post-meta-item-icon">
      <i class="fa fa-user"></i>
    </span>
    <span class="site-uv" title="Total Visitors">
      <span class="busuanzi-value" id="busuanzi_value_site_uv"></span>
    </span>
  

  
    <span class="post-meta-divider">|</span>
  

  
    <span class="post-meta-item-icon">
      <i class="fa fa-eye"></i>
    </span>
    <span class="site-pv" title="Total Views">
      <span class="busuanzi-value" id="busuanzi_value_site_pv"></span>
    </span>
  
</div>









        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    

    

    
  </div>

  

<script>
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>


























  
  <script src="/lib/jquery/index.js?v=3.4.1"></script>

  
  <script src="/lib/velocity/velocity.min.js?v=1.2.1"></script>

  
  <script src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>


  


  <script src="/js/utils.js?v=7.2.0"></script>

  <script src="/js/motion.js?v=7.2.0"></script>



  
  


  <script src="/js/affix.js?v=7.2.0"></script>

  <script src="/js/schemes/pisces.js?v=7.2.0"></script>



  
  <script src="/js/scrollspy.js?v=7.2.0"></script>
<script src="/js/post-details.js?v=7.2.0"></script>



  


  <script src="/js/next-boot.js?v=7.2.0"></script>


  

  

  

  


  


  




  

  

  

  

  

  

  

  

  

  

  

  

  

  

<script src="/live2dw/lib/L2Dwidget.min.js?094cbace49a39548bed64abff5988b05"></script><script>L2Dwidget.init({"pluginRootPath":"live2dw/","pluginJsPath":"lib/","pluginModelPath":"assets/","tagMode":false,"log":false,"model":{"scale":1.5,"hHeadPos":0.5,"vHeadPos":0.618,"jsonPath":"/live2dw/assets/z16.model.json"},"display":{"superSample":2,"position":"left","width":150,"height":300,"hOffset":0,"vOffset":-20},"mobile":{"show":false,"scale":0.5,"hOffset":0,"vOffset":-10},"react":{"opacity":0.8,"opacityDefault":0.7,"opacityOnHover":0.2}});</script></body>
</html>
